home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / lib / rcscripts / net.modules.d / iproute2 < prev    next >
Text File  |  2006-04-25  |  7KB  |  295 lines

  1. # Copyright (c) 2004-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header$
  4.  
  5. # Contributed by Roy Marples (uberlord@gentoo.org)
  6.  
  7. # Fix any potential localisation problems
  8. # Note that LC_ALL trumps LC_anything_else according to locale(7)
  9. ip() {
  10.     LC_ALL=C /sbin/ip "$@"
  11. }
  12.  
  13. iproute2_tunnel() {
  14.     LC_ALL=C /sbin/ip tunnel "$@"
  15. }
  16.  
  17. # void iproute2_depend(void)
  18. #
  19. # Sets up the dependancies for the module
  20. iproute2_depend() {
  21.     after macchanger wireless
  22. }
  23.  
  24. # bool iproute2_check_installed(void)
  25. #
  26. # Returns 1 if iproute2 is installed, otherwise 0
  27. iproute2_check_installed() {
  28.     local report=${1:-false} installed=0
  29.     if [[ ! -x /sbin/ip ]]; then
  30.         installed=1
  31.         ${report} && eerror "For iproute2 support, emerge sys-apps/iproute2"
  32.     fi
  33.     if [[ ! -e /proc/net/netlink ]]; then
  34.         installed=1
  35.         ${report} && eerror "iproute2 requires NetLink enabled in the kernel"
  36.     fi
  37.     return ${installed}
  38. }
  39.  
  40. # char* iproute2_provides(void)
  41. #
  42. # Returns a string to change module definition for starting up
  43. iproute2_provides() {
  44.     echo "interface"
  45. }
  46.  
  47. # char* iproute2_module(void)
  48. #
  49. # Returns the module name
  50. # This is needed by dhclient as we run different scripts
  51. # based on the interface
  52. iproute2_module() {
  53.     echo "iproute2"
  54. }
  55.  
  56. # bool iproute2_check_depends(void)
  57. #
  58. # Checks to see if we have the needed functions
  59. iproute2_check_depends() {
  60.     local f
  61.  
  62.     for f in interface_device interface_variable; do
  63.         [[ $( type -t ${f} ) == function ]] && continue
  64.         eerror "iproute2: missing required function ${f}\n"
  65.         return 1
  66.     done
  67.  
  68.     return 0
  69. }
  70.  
  71. # bool iproute2_exists(char *interface, bool report)
  72. #
  73. # Returns 1 if the interface exists, otherwise 0
  74. iproute2_exists() {
  75.     local e=$( ip addr show label ${1} ) report=${2:-false}
  76.     [[ -n ${e} ]] && return 0
  77.     ${report} && eerror "${1} does not exist"
  78.     return 1
  79. }
  80.  
  81. # void iproute2_up(char *interface)
  82. #
  83. # provides a generic interface for bringing interfaces up
  84. iproute2_up() {
  85.     ip link set up dev ${1} &>${devnull}
  86. }
  87.  
  88. # void iproute2_down(char *interface)
  89. #
  90. # provides a generic interface for bringing interfaces up
  91. iproute2_down() {
  92.     ip link set down dev ${1} &>${devnull}
  93. }
  94.  
  95. # bool ifproute2_is_up(char *iface, bool withaddress)
  96. #
  97. # Returns 0 if the interface is up, otherwise 1
  98. # If withaddress is true then the interface has to have an IPv4 address
  99. # assigned as well
  100. iproute2_is_up() {
  101.     local iface=${1} addr=${2:-false}
  102.  
  103.     ip link show ${iface} 2>${devnull} | grep -Eq "\<UP\>" || return 1
  104.     ! ${addr} && return 0
  105.     ip addr show ${iface} 2>${devnull} | grep -v link | grep -q 'inet ' || return 1
  106. }
  107.  
  108. # void iproute2_set_flag(char *iface, char *flag, bool enabled)
  109. #
  110. # Sets or disables the interface flag 
  111. iproute2_set_flag() {
  112.     local iface=${1} flag=${2} enable=${3} opt="on"
  113.     ${enable} || opt="off"
  114.     ip link set ${iface} ${flag} ${opt} &>${devnull}
  115. }
  116.  
  117. # void loopback_create(void)
  118. #
  119. # Creates our loopback interface
  120. iproute2_loopback_create() {
  121.     ip addr add 127.0.0.1/8 dev lo brd + scope host &>/dev/null
  122.     iproute2_up lo
  123.     ip route add 127.0.0.0/8 dev lo &>/dev/null
  124. }
  125.  
  126. # void iproute2_get_address(char *interface)
  127. #
  128. # Fetch the address retrieved by DHCP.  If successful, echoes the
  129. # address on stdout, otherwise echoes nothing.
  130. iproute2_get_address() {
  131.     ip -family inet addr show ${1} 2>${devnull} | awk '/inet/ {print $2}' | cut -d/ -f1
  132. }
  133.  
  134. # void get_mac_address(char *interface)
  135. #
  136. # Fetch the mac address assingned to the network card
  137. iproute2_get_mac_address() {
  138.     ip link show ${1} 2>${devnull} | awk '/link/ {print $2}' | cut -d/ -f1
  139. }
  140.  
  141. # void iproute2_get_aliases_rev(char *interface)
  142. #
  143. # Fetch the list of aliases for an interface.  
  144. # Outputs a space-separated list on stdout, in reverse order, for
  145. # example "eth0:2 eth0:1"
  146. iproute2_get_aliases_rev() {
  147.     local iface=$( interface_device ${1} )
  148.     ip addr show dev ${iface} 2>${devnull} | awk -v re="^${1}:" \
  149.         '$NF~re {print $NF}' | tac | xargs
  150. }
  151.  
  152. # bool iproute2_del_addresses(char *interface, bool report)
  153. #
  154. # Remove addresses from interface.
  155. iproute2_del_addresses() {
  156.     local iface=${1}
  157.  
  158.     ip addr flush label ${iface} scope global &>/dev/null
  159.     ip addr flush label ${iface} scope host &>/dev/null
  160.  
  161.     return 0
  162. }
  163.  
  164. # char* iproute2_get_vars(char *interface)
  165. #
  166. # Returns a string spaced with possible user set
  167. # configuration variables
  168. iproute2_get_vars() {
  169.     echo "config_${1} routes_${1} fallback_${1} ipaddr_${1} ipaddr_fallback_${1} iproute_${1} inet6_${1}"
  170. }
  171.  
  172. # bool iproute2_get_old_config(char *iface)
  173. #
  174. # Returns config and config_fallback for the given interface
  175. iproute2_get_old_config() {
  176.     local ifvar=$( interface_variable ${1} ) inet6
  177.  
  178.     # iproute2-style config vars
  179.     eval config=( \"\$\{ipaddr_${ifvar}\[@\]\}\" )
  180.     eval config_fallback=( \"\$\{ipaddr_fallback_${ifvar}\[@\]\}\" )
  181.     eval inet6=( \"\$\{inet6_${ifvar}\[@\]\}\" )
  182.  
  183.     # BACKWARD COMPATIBILITY: check for space-separated inet6 addresses
  184.     [[ ${#inet6[@]} == 1 && ${inet6} == *' '* ]] && inet6=( ${inet6} )
  185.  
  186.     # Add inet6 addresses to our config if required
  187.     [[ -n ${inet6} ]] && config=( "${config[@]}" "${inet6[@]}" )
  188.  
  189.     return 0
  190. }
  191.  
  192. # bool iproute2_iface_stop(char *interface)
  193. #
  194. # Do final shutdown for an interface or alias.
  195. #
  196. # Returns 0 (true) when successful, non-zero (false) on failure
  197. iproute2_iface_stop() {
  198.     local label=${1} iface=$( interface_device ${1} )
  199.  
  200.     # Shut down the link if this isn't an alias or vlan
  201.     if [[ ${label} == ${iface} ]]; then
  202.         iproute2_down ${iface}
  203.         return $?
  204.     fi
  205.     return 0
  206. }
  207.  
  208. # bool iproute2_add_address(char *interface, char *options ...)
  209. #
  210. # Adds an the specified address to the interface
  211. # returns 0 on success and non-zero on failure
  212. iproute2_add_address() {
  213.     local iface=${1} x
  214.  
  215.     iproute2_exists ${iface} true || return 1
  216.  
  217.     # Extract the config
  218.     local -a config=( "$@" )
  219.     config=( ${config[@]:1} )
  220.  
  221.     # Convert an ifconfig line to iproute2
  222.     local n=${#config[@]};
  223.     for (( x=0; x<n; x++ )); do
  224.         case ${config[x]} in
  225.             netmask)
  226.                 config[0]="${config[0]}/$( netmask2cidr ${config[x+1]} )"
  227.                 unset config[x]
  228.                 unset config[x+1]
  229.                 ;;
  230.         esac
  231.     done
  232.     config=( "${config[@]//pointtopoint/peer}" )
  233.  
  234.     # Make sure interface is marked UP
  235.     # This is required for IPv6 addresses
  236.     iproute2_up ${iface}
  237.  
  238.     # If the address already exists then the following command
  239.     # will fail.  Catch the failure and be graceful
  240.     x=$( ip addr add dev ${iface} ${config[@]} 2>&1 )
  241.     case "${x}" in
  242.         'RTNETLINK answers: File exists'|'')
  243.             eend 0
  244.             return 0
  245.             ;;
  246.         *)
  247.             printf '%s\n' "${x}" >&2
  248.             eend 1
  249.             return 1
  250.     esac
  251. }
  252.  
  253. # bool iproute2_post_start(char *interface)
  254. #
  255. # Runs any post_start stuff on our interface and adds routes
  256. # Always returns 0
  257. iproute2_post_start() {
  258.     local iface=${1} ifvar=$( interface_variable ${1} ) routes e r
  259.  
  260.     # Make sure interface is marked UP
  261.     iproute2_up ${iface}
  262.  
  263.     eval routes=( \"\$\{routes_${ifvar}\[@\]\}\" )
  264.  
  265.     # Test for old style ipaddr variable
  266.     if [[ -z ${routes} ]]; then
  267.         eval routes=( \"\$\{iproute_${ifvar}\[@\]\}\" )
  268.     fi
  269.  
  270.     [[ -z ${routes} ]] && return 0
  271.  
  272.     # Set routes with ip route -- this might also include default route
  273.     einfo "Adding routes"
  274.     eindent
  275.     for x in "${routes[@]}"; do
  276.         # Support net-tools routing too
  277.         x=${x//gw/via}
  278.         x=${x//-A inet6}
  279.  
  280.         einfo "${x}"
  281.         e=$( ip route append dev ${iface} ${x} 2>&1 )
  282.         case "${e}" in
  283.             'RTNETLINK answers: File exists'|'')
  284.                 eend 0
  285.                 ;;
  286.             *) printf '%s\n' "${e}" >&2
  287.                 eend 1
  288.                 ;;
  289.         esac
  290.     done
  291.     eoutdent
  292.  
  293.     return 0
  294. }
  295.